Q:

method returns dynamic type of List

If I have the following:
class Super {
 //stuff 
}

class Sub1 : Super {
 //stuff
}

class Sub2 : Super {
 //stuff
}

class Sub3 : Super {
 //stuff
}

Run Class
class Run {

 //list of type Super with a bunch of sub objects (sub1,sub2,sub3)
 List<Super> superList = sub1,2,3 list;
 List<Super> partialSuperList;

 void doStuff() {
  Type subObjectType = superList[0].GetType();
  if (subObjectType == typeof(sub1)) {
   partialSuperList = categorize(subObjectType);
  } else if (subObjectType == typeof(sub2)) {
   partialSuperList = categorize(subObjectType);
  } else if (subObjectType == typeof(sub3)) {
   partialSuperList = categorize(subObjectType);
  }
 }

 List<Super> categorize(Type type) {
  List<type> subTypeList = new List<type>();
  //loop through subtype list and add it to a super type list
  return SuperList;
 }
}

as you can see I'm trying to dynamically create a list with a "type" coming from the argument to the method, am I doing this right or is there another way to do this? 

A:

It's hard to judge if you are doing the right thing since your pseudo code doesn't compile at the moment. 
I think you are trying filter a list based on some type.  I think the Linq method OfType<TResult> is what you are looking for. 
var superList = new List<Super> { ... };
var sub1List = superList. OfType<Sub1>().ToList();
var sub2List = superList. OfType<Sub2>().ToList();
var sub3List = superList. OfType<Sub3>().ToList();

If you are want to filter on a type you do not know at compile-time, you can do the following:
var superList = new List<Super> { ... };
var someType = superList. First().GetType();
var filteredSuperList = superList. Where(x => x.GetType() == someType).ToList();

A:

Make the method generic:
List<T> doStuff<T>() where T : Super
{
    List<T> list = new List<T>();

    // use list
}

You don't have the casting problems you have now, and you can check T using is:
if (T is Sub1)
{
    ... // do something
}

