WPF Mvvm async function ViewModel
General


Your model should not return an ObservableCollection because that collection should be used only if its change notification ability is needed (e.g. with data binding). The method GetDocuments should return an Array or an IEnumerable.
The method InitializeColumns also seems to be GUI related. Consider moving it to the view model.


Background Processing

If you have to load documents in the background, I would suggest using BackgroundWorker (for .Net Framework 3.5 and below). But you should use it more like:


Pass the model to the RunWorkerAsyncmethod and use the Argument property to access it.
Do not access view model properties from within the DoWork delegate because that is the code that will be executed in the background. Assign the calculated result to the Result property instead.
Use the RunWorkCompleted method to process the calculated result on the GUI thread.


e.g:

var bw = new BackgroundWorker();
bw.DoWork += (o, e) =&gt; e.Result = (e.Argument as Model).GetDocuments();
bw.RunWorkerCompleted += (s, e) =&gt; ShippingDocuments = new ObservableCollection((ShippingDocument[])e.Result);
bw.RunWorkerAsync(model);