It sounds like you might be looking for the ExpandoObject class. This class implements IDictionary<string, object>, allowing it to store name/value pairs. It also implements IDynamicMetaObjectProvider; this implementation allows you, by way of the dynamic type (in C# 4.0 and higher), to use normal "dot" syntax to read and write properties whose names are known at compile time (that is, variable.Member).
This example assumes that you have a function GetPropertyValues() that returns an IEnumerable<KeyValuePair<string, object>> with the properties' names and values:
var obj = new ExpandoObject();
var propertyValues = GetPropertyValues();
foreach (var nameValuePair in propertyValues)
obj[nameValuePair.Key] = nameValuePair.Value;
HttpContext.Current.Session[Object1] = obj;
If you know that the object has an ID property and a Status property, for example, you could use it like this:
dynamic obj = HttpContext.Current.Session[Object1];
var identifier = obj.ID; // basically the same as var ID = obj["ID"];
obj.Status = GetStatusForID(identifier);
//you can also add properties just by writing to them:
obj.ThisPropertyMightNotExist = "moo";
HttpContext.Current.Session[Object1] = obj;