Definitive answer: It depends.
A repeater is more than acceptable presuming that you have something you can bind it to. If the grids are going to show data that are children of some other data, then it makes perfect sense to build a repeater that binds to the parent data (that's your outer loop) and then the grid withing the repeater template (which also contains the text elements) binds to child data.
Take a look at
this sample for the general idea. It has a datagrid that contains a dropdownlist, but the theory and technique will be the same for a datagrid within a repeater. You will most likely need to do much customization of each individual grid based on the various requirements. You can tap into the datagrid's "ItemCreated" event so you can manipulate the various parts of each grid when each item of the grid is created (i.e. the header, item/alternate item, footer).
Peter
------------------------------------------------------
Work smarter, not harder.