Edhy,
It is always nice to get other peoples perspectives as I am on the other side of the fence when it comes to the ListView vs. the Grid. I think that grids have many good uses, but for read-only data, I think they produce too much overhead and too many potential bugs since the grid is so versatile and has so many properties and different types of functionality to meet a wide-spectrum of needs.
We tried to design our ListView so that read-only data could be loaded very easily. Simply create the columns, determine if the column will be pulled from a field in the BO or populated through an event. For example, you can use the approach that Tim pointed out by creating a custom property...or you can create a scalar method, create a fill method that includes the columns you need, etc. then indicate that column will be "Populated Through Event." You will then handle the RowPopulating event of the ListView and set the column information for each row:
RowPopulatingEvent
With CType(e.BusinessObject, MyBO)
e.Columns(1).DisplayValue = CType(.CurrentRow.Item("MyIncludedField"), String)
'-- OR
e.Columns(1).DisplayValue = .MyCustomProperty
'-- OR
e.Columns(1).DisplayValue = SomeBO.ExecuteAScalarMethod()
'-- OR
e.Columns(1).DisplayValue = (.CalcField1 + .CalcField2).ToString("n0")
EndWith
As you can see, there are many different ways to pull in data for a column that may come from another table or may be a calcualted field.