I think you have a communication problem or a nomenclature problem, because sharing problems usually means something else.
Strictly speaking, the separation of problems concerns such things as the principle of shared responsibility, in that each class deals with its own domain. In principle, a single responsibility states that a class should have only one reason for the change.
Some examples of problem separation are presentation models and abstraction models, such as MVC or MVVM. Where each component, whether it be a view or a model, concerns an abstraction of the user interface or data and validation, but not both.
Separating code into separate assemblies is good practice when the code can be shared between several projects (for example, you yourself have already indicated). Simple structuring code can be done using different namespaces.
When you have a lot of code, assemblies are a natural way of grouping code, and when you manage code at different levels and have very controlled extensibility points and want to block it, assemblies provide this level of isolation.
source share