Alexandre não tem segredo, configura a visualização da tabela e joga os dados da lista.
Tenta fazer um cast forçado, ex:
ObservableList<Grupo> lista = FXCollections.observableArrayList();
lista = FXCollections.observableList((List<Grupo>) metodo_que_retorna_lista_do_banco(Grupo.class));
tabela.getItems().clear();
tabela.getItems().addAll(lista);
E na visualização::
nomeColumn.setCellValueFactory(new PropertyValueFactory<>("nome_do_atributo_da_classe"));
ou se quiser personalizado:
nomeColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Grupo, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Grupo, String> param) {
return new SimpleStringProperty(*******formata da forma que quiser*********param.getvalue());
}
});
Veja se sua lista está vindo corretamente do banco, se está configurando a visualização antes de jogar os dados na tabela, etc.