Beh... invece di stampare direttamente "${book}", usa questo "book" in un altro for-each. In questo modo stampi tutti i suoi valori.
codice:
<c:forEach var="book" items="${books}">
<c:forEach var="prop" items="${book}">
<li>${prop}</li>
</c:forEach>
</c:forEach>
Per come hai strutturato la cosa, stampare solo titolo e autore è problematico perchè devi crearti una variabile da usare come contatore e stampare solo quando tale variabile assume i valori 1 e 2 (poichè tu inserisci, nell'ordine: ID, titolo, autore, editore, ecc).
codice:
<c:forEach var="book" items="${books}">
<c:set var="propCount" value="0" />
<c:forEach var="prop" items="${book}">
<c:if test="${propCount == 1 || propCount == 2}">
<li>${prop}</li>
</c:if>
<c:set var="propCount" value="${propCount + 1}" />
</c:forEach>
</c:forEach>
La cosa sarebbe stata decisamente più semplice se, invece di avere un List<List<String>> per i libri con le loro proprietà, avessi creato un bean "Libro" con tutte le sue proprietà e avessi usato un List<Libro> (che è quello che si fa di solito). Supponendo di avere la classe Libro con tutte le sue belle proprietà:
codice:
<c:forEach var="book" items="${books}">
<li>${book.titolo} - ${book.autore}</li>
</c:forEach>
Ciao.