Following the lines of how nodegroups work, what if a whole “material” shading nodetree was a ‘‘meta’’ nodegroup?
As if it was an input group, this node would provide Shader, Volume Shader and Displacement data from an existing material, to be used at will into any material.
This would be sooo handy when you want to mix two or more already done/estabilished materials (ie from a mat-library), into a new one. Think of a rusted metal: you already have the two shaders; no need to encapsulate them into nodegroups, or to copy-paste nodes from tree to tree, you just call the shaders into the new one and mix them at will.
Or you can use this to build up on a material, for example changing only the displacement. Or adding shaders (ie a coatlayer), volume or whatever. Again, no need to rearrange previous materials in nodegroups. No duplicated nodetrees. Just import all your material outputs into another one!
Of course the material Input node shouldn’t allow cross-reference between materials. Only actual linkable materials in the drop-down menu should be shown.
The idea could be extended with the ability to plug any wire into the Output Material node, just as it happens in nodegroups.
So any data could be tranferred in any other material. Directly pointing at them in the source nodetree. There could be even a dedicated panel in the sidebar to rearrange and rename this AOVs, very similar to what we have for nodegroups.