Cara,
é um negócio não muito trivial. E não dá pra eu fazer a resposta pra você (ia tomar bastante do meu tempo), mas vou dar algumas sugestões:
Você pode usar tags do Tomahawk? Se sim, beleza, pois uma das tags é a t:dataList, que pode renderizar uma lista sem colocá-los em um table. A idéia é que você coloque os elementos de uma coluna dentro de um div, cujo estilo possui “float: left”: assim haveria várias colunas ao lado da outra.
Resolvido o problema de como formatar coluna, é hora de quebrar as colunas. Uma alternativa é usar c:if e dizer que a tag div só será impressa quando um certo limite for atingido (por exemplo, se: item % 4 == 0 && item != 0), mas como é tag JSP e não JSF, não sei se funcionaria. Outra alternativa é colocar dois dataList aninhados, o dataList “outer” retornaria, para cada iteração, uma lista contendo apanas os elementos da coluna atual, aí dentro dela haveria o abre-div, o dataList “inner” e o fecha-div; e o dataList “inner” iteraria cada elemento da coluna. Nesse caso o managed bean precisa ser alterado.
Bom, espero ter ajudado.