I know it does not answer your question directly, but you might find useful to
take a look at the solution used in the xPack QEMU Arm (formerly GNU ARM
Eclipse QEMU).
In this fork I dynamically create the peripheral registers when QEMU starts, by
reading a JSON file, converted from the CMSIS SVD files.
Unfortunately this is not enough, since the actions associated with each
register are not defined in these JSONs, and need to be hardcoded in code.
But I think that the mechanism to create peripherals and registers might be
adapted to your use case too.