If you want per-object material changes, Clone() the material and make the changes to the clone. Note that in this case optimizations such as instancing can’t be applied, instead each model using a unique material will be its own draw call.
There was a recent bug related to Clone() and shader parameter changes not working as expected, so I recommend to pull the latest master.
Shader is specified in technique / pass, so in this case you would also need to make a copy of the technique and make sure the original is not changed. Currently Technique doesn’t have a Clone() function so I’d recommend pre-authoring the needed techniques with different shaders as actual files.