Background_DoWork is running in the background but it is still a sequentially executing chunk of code like any other method. It's doing exactly what you told it to in the order you told it:
1) Copy directory
2) update progress
You need to update the progress bar as you're copying the contents of the directory. You didn't post the contents of your Copy method so I'm just guessing how to update it. Something like
string[] fileList = Directory.GetFiles (sourceDir);
for (int i = 0; i < fileList.Length; i++)
{
backgroundWorker1.ReportProgress(i * 100 / fileList.Length);
}
(edit: fixed the for loop exit test (was <=))