Generic MemoryCache class
Instead of having a cache

private static Dictionary&lt;string, ObjectCache&gt; cacheStore;


you could have one keyed of the types:

private static Dictionary&lt;Type, ObjectCache&gt; cacheStore;


This means you don't need to call typeof(T).ToString() everywhere.
You duplicate the code of building the key in all 3 methods - it should be extracted into a private BuildKey(string userId, int year) method. This means if you need to change how the key is built you only need to touch one method rather than all of them.
I would provide a Register method which accepts a type for which to create a new cache rather than hard-coding it in.
The cache policy is also not configurable - which means you are stuck with it unless you want to change the code.
You really really should think hard about whether a static cache is the right way to go. It will give you trouble in unit testing and it will also make it impossible for multiple classes to have different cache with different policies for example.