I use custom data objects to populate data controls. Typically, I'll create a factory object and factory method that returns a List<> collection of "ConcreteProducts". For example, RegistrationRuleFactory f = new RegistrationRuleFactory(connectionString);