Let me make sure I get this....if I had a customer business object with a really cool custom property like TotalOrders, it is impossible for me using that custom property to display all customers with more than 100 orders. Is that right?
It depends...

It really has nothing to do with the custom property, but everything to do with the columns in the underlying DataTable (CurrentDataTable). This is controlled by the Fill method used (i.e. by the SQL statement or sproc used to fill the DataTable). The DataTable is not limited to the columns defined as strongly typed properties of the BO...it can have extra columns if needed (it also doesn't have to have all columns needed by the strongly typed properties either, you can leave some out too). If you have a custom property that gets its data from an extra column that you loaded into the DataTable, then you
could appear to use that custom property to filter the DataTable.
However, what you seem to desire is a way to limit the data retrieved by the user from the database. In this case you don't actually want to use the BO.Filter. It limits what is shown to the user after all the data has been retrieved (disconnected data model of .NET). So, instead you have to limit the data retrieved within a Fill method.
To limit the data retrieved, you provide Fill methods that do filtering for you, via a SQL statement or Sproc. In the case of filtering on the TotalOrders, you'd need a Fill method that accepted the criterion (and optionally the comparison operator) and build the SQL statement/command. This can get exciting if you have lots of possible filtering fields/options. I use this extensively as my users are all remote, so network latency is a big issue.
If the data retrieved isn't really the issue, then you can use the BO filter options, along with a custom property by using a Fill method that returns the extra columns, then the BO's Filter will work. I.e. your fill SQL might look like this:
Select
CustomerID
,CustomerName
,(Select Count(*)
From Orders
Where o.CustomerID = Customers.CustomerID) As TotalOrders
From Customers
Then, have your custom property use the data in the data table...
return (integer)this.CurrentRow("TotalOrders")
Now, if I'm correct, setting the Filter of the BO to "TotalOrders>100" should work. However, this does
not limit the data on the wire. All the data is pulled and it only filters what the user sees. So, if there are 10,000 customers, but only 10 with TotalOrders > 100, this pulls 10,000 from the database and then user can choose to see only 10 of them.