What you want is doable up to a point – however you won’t actually get much benefit over simply using cmds to add custom attributes.
If you want nodes with predictable properties, you’ll basically need to have an MPxNode class for every type of node. That is good for searching – each nodetype will be unique – and for predictability, since you can then rely on the presence of named properties on your nodes. However, once you start dynamically adding properties you won’t be able to rely on the presence of different attributes – effectively you’ll have to use your custom nodes as if they were networks with custom attributes.
You can definitely write some code to make it eaiser to generate new plugin node types faster, but in the end custom nodes want to be predictable and determinate, where custom attributes are more general but less predictable. There’s not going to be much of a sweet spot in the middle, although maybe you could do a mix of a small number of base types with a larger variety of custom attributes. I’m pretty sure the only opportunity to register a new node type is when the plugin that defines it is loaded (I could be wrong about that – but that’s how I rememember it.) You need to call OpenMaya.MFnPlugin.registerNode to tell Maya about the existence of the node, and that requires a handle to the plugin. It might be possible to implement a separate command in the same plugin to create and register a new node based on, say, a json file – but you’d have to run that script every time the plugin loads and you’d have to handle the case of json files moving or changing between runs.
You will also need to decide how you want to distribute things: user’s won’t get access to your custom nodes if they don’t have the plugin(s) which define them. Network + custom attributes will not have any external dependencies.
In general, if you want the nodes to be configurable on the fly I’d stick with networks and custom attributes. MPxNodes work better as static code – that way you have built in mechanisms for version changes and updating out-of-date data.