Changing the DD item also works - I am using the C api SetGridColumnDataDictionaryItem, but I assume the ER system function equivalent would work the same way. Just have to call it before the grid record is written. The one downside is that any cells open for data entry, regardless of where they are in the grid, will display the number format at the time the grid record was written (which is what you want) HOWEVER, if you edit the value in that cell it will have the number format for the last call to the system function. In my specific case this is not a problem because all the data entry cells have the same number format so after the grid is loaded I make one final call to set the number format for data entry. Also, calling SetGridColumnDataDictionaryItem resets your column heading to the DD default so at the end you have to call SetGridColumnHeading to reset your column headings.
Other than those little quirks I think this might actually work.