I was able to figure out my own issue.
The suggested approach does not work because I need the blocks to be created each time the simulation is run based on the inputs. For example, if the inputs specify 2 blocks, I need 2 blocks created. This means, it doesn't just need to occur once, it should occur every time the simulation is run.
I found the most intuitive method (and consistent with other Library blocks in the software tool) is to create a mask which reads in variables (inputs) from the Workspace, compares the inputs to the existing blocks, deletes previous blocks if they exist, and adds the new blocks and lines according to the inputs. This ensures that the blocks in the Simulink model are always consistent with the inputs.