Il casting lo fai perché l'ArrayList non è tipizzato, quindi è fatto per contenere Object, e a livello di compilazione il compilatore NON può sapere cosa troverà alla posizione 0 della lista.
Se avessi un ArrayList <ArrayList> il casting non servirebbe, ma un Object ovviamente non può avere il metodo add ...
Ovviamente a runtime il casting fallirà con una ClassCastException se l'elemento trovato non fosse un ArrayList (o un derivato).