El GridView es básicamente como un ListView pero cuyos elementos están organizados en una cuadrícula estricta. Se adjunta a un Adapter, y recupera las vistas del Adapter cuando el usuario se desplaza por él. Todos los elementos de la rejilla deben tener el mismo tamaño. El usuario puede mover un selector visible a través de cada elemento — el objetivo de un GridLayout es mostrar los datos de un Adapter y dejar que el usuario navegue y seleccione cada uno de los elementos mostrados. La única diferencia con un ListView es que los elementos se colocan en una cuadrícula en lugar de en una lista vertical.
TableLayout es sólo un gestor de diseño, algo así como una tabla en HTML. No hace por sí mismo ningún desplazamiento; para tener algo que se desplace debes poner el TableLayout en un ScrollView. Esto implica que todos los datos que se están mostrando deben ser rellenados en el TableLayout por adelantado, para que el ScrollView sepa el espacio total en el que se va a desplazar. Tampoco le da directamente una selección o interacción por «ítem», porque un TableLayout no tiene ítems, es sólo un gestor de diseño.
No ha dado suficiente información útil sobre lo que está tratando de hacer para que alguien le recomiende qué usar. Depende mucho de lo que quieras específicamente.