I want the shortcode to output “full blocks”
This is the wrong approach, instead you want a block that outputs a shortcode.
Specifically, a block that is rendered via PHP. Once you know how to do that it becomes as trivial as calling do_shortcode
and inserting block attributes into the shortcode by crafting it, e.g. something like this:
do_shortcode( '[myshortcode attribute1="' . $attribute1 . "]' );
Although in your case it’s usually easier to call the function that implements the shortcode directly.
You can specify a PHP file to render your block in block.json
that you can call your shortcode in. You should not need a save component in your block, and you can use a server side renderer in your edit component to display the result of your shortcode in the block editor.
Once you’ve done this, you can ignore shortcodes and deal entirely with standard blocks and standard solutions to block problems.