Well, I wouldn't say it was the wrong way, just the DOM way ;-)
Firstly DOM functions are not silverstripe - if they don't work then the only place to ask for help in the section UncleCheese moderates - DataObjectManager. For this reason I do not use it - instead I stick close to the core.
Secondly the silverstripe API HasManyComplexTableField & HasOneComplexTableField (which DOM builds on top) are there to use and I have occasionally added one of these - BUT with your dataobjuects set up correctly - then these are scaffolded for you - why write the code again yourself?
I recommend you drop each one of your getCMSFields function from the data objects and see how ModelAdmin scaffolds it all, then change what you want changed...