I'd say share only what was designed and intended to be shared.
Most times I've found code sharing just out of laziness, that is, sharing code that wasn't designed at all to be shared nor with it in mind. This almost always results on problems later on when the original code needs to be changed and there's no easy way to do it because the code was intended to be used from one location and not several so the designer didn't cope with the possibility of extension for multiple "users".
On the other hand you may have in mind that you are designing something to be shared, for example a communication library or an encryption library or the entire .NET framework. In this cases sharing is ideal and will improve both maintainability and code reuse because the design covered it from the beginning.
That doesn't only applies to assemblies but to classes, resources or any other piece of your project. That's the reason why design is so important, because having thought about it beforehand you have foreseen most of the possible complications and therefore the impact of sharing has been quantified and limited so that the cost of sharing is below the benefits. If you rush into sharing things without taking the consequences into account then your code will not be prepared for it and therefore the cost of adapting the code for sharing or the related problems of sharing will be quite higher than any possible benefit.