But now if I understand correctly the whole concept of "Techniques" and "Passes" is just an abstraction for selecting different bits of shader bytecode to bind to the device? And that would also mean I'm going to have to parse the technique/pass definitions and implement a whole new technique and pass system in the engine to use it? If that's the case I can no longer use EffectPass.Apply() anymore either... thus I'm going to need to... I dunno... bind shader bytecode individually to the device interface's "PixelShader", "VertexShader", and "GeometryShader" (and the other stages for D3D11, of course) objects? I've never even seen anyone do this before, hmmm... However, if I understand correctly doing all this work will be worth it because I will have a very powerful/flexible system where I can dynamically piece together complete effects from fragments on-the-fly and (theoretically) generate tons of effect permutations from fragments?
That's pretty much the idea behind it, yes
You could write a parser for .fx files, but that might not be an ideal situation. In my shader system I separate the actual shader code (in .hlsl files, not .fx files) and the shader program definition (ie. the matching of vertex shaders, pixel shaders, geometry shaders, etc.) into 2 different files so you don't get one huge file with too much differing data in it. This allows for very easy mixing and matching.
The shader program definition file is just a plain XML file specifying where to look for the source code (can be multiple plain .hlsl files), which entry point to use for each stage, which preprocessor defines to use, which compilation flags to use, etc. Blend, rasterizer and depth states are handled by the pipeline itself and not by the shader, and I have no concept of passes or techniques. I do allow for multiple shader 'setups' which correspond to a specific render pipeline setup so I can easily change how my pipeline works on the fly, but that's not really all that relevant here I suppose.
Because the shader definition file is just plain XML it becomes very easy to push it through my content pipeline without having to write any fancy parsers. I just use a generic serialization system to store all the values in my XML file, and I use these values to let my compiler build a binary shader definition file (which also encompasses my shader binaries) which can be loaded into my engine very fast with a minimal amount of parsing.
This basically comes down to that tool you mentioned at the end of your post