IValueConverters are used solely for UI display purposes. Data operations such as filtering are always performed on the raw data, i.e. what the column is actually bound to.
Right, that's the thing: the column *isn't* bound. At least, not in the normal way. Here's the binding declaration from the GridViewDataColumn object initializer:
ConverterParameter = attributeMetadata
Notice, there's no Path. The Converter handles the data display as a string, it has a series of conditionals to handle getting a string value to display from various CRM data types.
Due to a customer deadline, and really the need for filtering to only work on one view, we have created a custom object to serve as the data context & do "normal" binding, which means we get the out-of-the-box sorting & filtering.
I *tried* to write a custom filtering control per this description, but got nowhere without the column actually being *bound* to anything. The Path property is just an empty string.
If I had a chance to start over, I'd use the dynamic binding described here: http://blogs.telerik.com/vladimirenchev/posts/11-09-28/dynamic-binding-for-your-silverlight-applications.aspx
I'm thinking binding the incoming property bag to a dynamic object would solve my problem, but I hadn't ever had a reason to use dynamics before, so it didn't occur to me until I was too far down the road.