I think I see where you are going with this question, but binding data in of itself is a very low cost operation. The particular part of binding collections to controls that can cause performance impact is the generation/rendering of the UI elements to display those items.
The latter part is mitigated in WPF via virtualization. So let's say your ListBox is hidden, or maybe has just 10 rows visible, and you bind a 10,000 element list to it. How much will that impact performance? Without going into extensive detail on virtualization, that answer is not much at all for normal UI display.
Now there's one more thing in this equation that can impact performance, and that's retrieving that initial list of 10,000 elements right? Perhaps it's a complex database call, or working with a hefty API... Hopefully this list is lazy loaded, but even when you do that if are binding data to a ListBox that binding will still occur and try to initialize that object even if it's hidden - and that may be a useless expense.
In this latest scenario you still want to use data binding; however, you want to initialize/populate the elements when the control is actually in view (i.e. on the current TabItem in a TabControl). There are numerous ways to do that, but generally your view will call an initialize method/command on your view model. If the view is already bound adding elements to the existing collection may cause cross-threading issues; however, if you set the property to a new collection you won't. And if you're working with large collections typically this approaches performs best so you're not firing notifications with each addition.
That all being said, both approaches have their pros and cons. If you're going to do background work and want to avoid threading issues I'd take a look at this article:
Multithreading in C# .NET 4.5 (Part 2)[
^]