It has everything to do with object casting. GetColumnValueAtRow returns an object which it cannot cast to DateTime. You can simulate the runtime exception with this code. The compiler doesn't catch it.
DateTime d;
Object o = DBNull.Value;
d = (DateTime)o; // Runtime exception here
Bottom line is that object references mean no strong typing.
>PS: Casting to object is special case and not the thing here.