You can use local snaps not registered in the store if you build the image using a grade: dangerous
model assertion. See Model assertion | Ubuntu for a more thorough explanation of the grade of a model assertion.
For using cloud-init specifically with UC20, we have changed the way that cloud-init works with UC20, specifically cloud-init is only usable under certain conditions, see this table for a full picture of how/when you can use cloud-init. We are working on a doc page about using cloud-init with UC20 to better explain this but it’s not ready quite yet
The prepare-device hook is not usable for this, but the ubuntu-data partition mentioned in the gadget.yaml is automatically expanded to use the rest of the disk if it is the last partition/structure in the gadget.yaml.