The 100% won't help you, because the FlowPanel (which contains your DataGrid as I understand it) has a height of 0 unless you fill it with widgets that mount their own height.
In other words, you are creating a cycle: The FlowPanel asks its children for the height they need, and the child (DataGrid) conversely asks the parent FlowPanel for its height. Obviously, this doesn't work, and in CSS, it always ends up with a height of 0 (not a special GWT thing).
It's not, that DataGrid and CellTable aren't interchangeable. To the contrary: They are highly interchangeable, but they differ basically in exactly this point: CellTables span up their own height from "inside out", whereas DataGrids require the size from "outside in".
(Note: Almost the only real reason for the requiresResize() is, that DataGrid uses a HeaderPanel, which performs one of the few JavaScript tricks still needed today, because CSS still can't do HeaderPanel-like layouts by itself.)