GridView è fondamentalmente come una ListView ma i cui elementi sono disposti in una griglia rigorosa. È attaccata ad un Adapter, e recupera le viste dall'Adapter quando l'utente le scorre. Tutti gli elementi nella griglia devono avere la stessa dimensione. L'utente può muovere un selettore visibile attraverso ogni elemento -- lo scopo di un GridLayout è quello di mostrare i dati da un Adapter e lasciare che l'utente navighi e selezioni ognuno degli elementi visualizzati. L'unica differenza da una ListView è che gli elementi sono messi in una griglia invece che in una lista verticale.
TableLayout è solo un gestore di layout, un po' come una tabella in HTML. Non fa alcuno scorrimento; per avere qualcosa che scorra devi mettere il TableLayout in una ScrollView. Questo implica che tutti i dati che stai visualizzando devono essere popolati nel TableLayout in anticipo, così la ScrollView conosce lo spazio totale in cui deve scorrere. Inoltre non ti dà direttamente la selezione o l'interazione per "elemento", perché un TableLayout non ha elementi, è solo un gestore di layout.
In realtà non hai dato abbastanza informazioni utili su ciò che stai effettivamente cercando di fare perché qualcuno possa raccomandare cosa usare. Dipende molto da cosa vuoi in particolare.