You just need to call ToList() on it afterwards:
static readonly MethodInfo CastMethod = typeof(Enumerable).GetMethod("Cast");
static readonly MethodInfo ToListMethod = typeof(Enumerable).GetMethod("ToList");
...
var castItems = CastMethod.MakeGenericMethod(new Type[] { targetType })
.Invoke(null, new object[] { items });
var list = ToListMethod.MakeGenericMethod(new Type[] { targetType })
.Invoke(null, new object[] { castItems });
Another option would be to write a single generic method in your own class to do this, and call that with reflection:
private static List<T> CastAndList(IEnumerable items)
{
return items.Cast<T>().ToList();
}
private static readonly MethodInfo CastAndListMethod =
typeof(YourType).GetMethod("CastAndList",
BindingFlags.Static | BindingFlags.NonPublic);
public static object CastAndList(object items, Type targetType)
{
return CastAndListMethod.MakeGenericMethod(new[] { targetType })
.Invoke(null, new[] { items });
}