Session state wrapper, extending an existing application
There are 4 places where you have code like,

if (session != null)
{
    List&lt;KeyValuePair&lt;string, T&gt;&gt; questionModelStore;

    if (session["QuestionModelStore"] == null)
    {
        questionModelStore = (List&lt;KeyValuePair&lt;string, T&gt;&gt;)session["QuestionModelStore"];


It would be neater if these were a common subroutine:

List&lt;KeyValuePair&lt;string, T&gt;&gt; GetQuestionModelStore&lt;T&gt;()
{
    var session = HttpContext.Current.Session;
    if (!session)
        return null;
    return (List&lt;KeyValuePair&lt;string, T&gt;&gt;)session["QuestionModelStore"];
}


That would simplify code such as:

public T GetValue&lt;T&gt;(string key)
{
    var cached = GetQuestionModelStore();
    if (cached == null)
        return default(T);
    return cached.FirstOrDefault(t =&gt; t.Key.Equals(key));
}


It might be slightly faster to use a Queue than a List, because a Queue is designed to let you enqueue at one end and dequeue at the other.

You're not quite implementing a LRU algorithm: if you want to do that, when you find an item in the cache you should move the item to the most-recently-used end of the list.

There's one bug I see, which is that your methods are generic: the first time you call SetValue it creates a List&lt;KeyValuePair&lt;string, T&gt;&gt;; unless all your SetValue and GetValue methods use the same type of T this will cause a run-time error (casting between different types of T). If all your SetValue and GetValue methods do use the same type of T then you might as well specify what T is instead of making it generic.