How to refactor a verbose datatype?
IDictionary&lt;string, IDictionary&lt;Levels, IList&lt;ProblemRule&gt;&gt;&gt; is difficult to understand and maintain. I don't know enough about your problem domain to give you reasonably sounding names for classes, but I'll try.

In your LoadProblems method, I see you set the IDictionary&lt;Levels, IList&lt;ProblemRule&gt;&gt; to a variable named problemPackage, so I would create a class ProblemPackage, containing a list of ProblemRules per Level (I would drop the 's' in Levels) and move the related logic there.

In ProblemBaseFactory you end up with a IDictionary&lt;string, ProblemPackage&gt;. ProblemPackage will have a IDictionary&lt;Level, ProblemRules&gt; and the class ProblemRules will be an easy wrapper around a IList&lt;ProblemRule&gt;.

If you try to delegate the work to these classes, the readability will almost certainly go up.