I don't believe that the list of data used to populate drop down lists and such should be explicitly called out in the business layer as a method. Why? Because it's UI specific; what happens when you hook another UI to the BL, or need to change the process flow of the UI? The BL has to change and I don't like that.
I use something I call a DisplayCollectionDefinition (basically combines ResultsetFields, RelationPredicatBucket, SortExpression, etc functionality into a single object) that is returned from a factory. I then set up a single BL Method that takes in the DisplayCollectionDefinition, and, using FetchTypedList returns a bindable datatable.
Public Function FetchDisplayCollection(def as DisplayCollectionDefinition, filter as RelationPredicateBucket) as DataTable
The key point here is that the list of fields itself does not represent business logic; it's the predicate alone that represents business logic. The beauty of LLBLGen Pro is that you can specify each of these independently and combine them at the DAL level to generate the actual query.
So, you can use the filter parameter above as is and allow the UI to get the PredicateExpression from the BL using a factory, or just change out the filter parameter for an enum that fetches the appropriate filter itself. Law of Demeter would require that you pass in the filter directly, but as it's at the cusp between BL and UI, encapsulation might prefer you use the enum.
Hope that makes sense.
I think this approach "cleans up" the BL surface, provides for increased flexibility in the UI layer, and generally promotes decoupling. The downside is that it's a late bound datatable, but this will change, I hope in the future.
Jeff...