Sorry, I don't know XAML very well, but could you try something like this?
NOTE: I don't think you can use a BackgroundWorker object in XAML, but you could use it in another class and find a way to pass the data into it.
The main idea here is to shift your work over to another thread, and populate it there.
...although, I must say: If you are really adding all of your items in one line (like is shown from your modified example below), I doubt there would be any flicker at all caused by this. Your flicker could be coming from somewhere else. Are there any event handlers that are triggered when the data source changes?
void Button_Click(object sender, RoutedEventArgs e) {
using (BackgroundWorker worker = new BackgroundWorker()) {
var items = new int[10000];
worker.DoWork += delegate {
for (int i = 0; i < items.Length; i++)
items[i] = i + 1;
};
worker.RunWorkerCompleted += delegate {
listBox.ItemsSource = items;
};
worker.RunWorkerAsync();
}
}