instead of using .CopyTo(), you write your own copy with a progress callback:
public void StreamCopy(Stream input, Stream output, Action<int> progressCallback)
{
int bytesRead = 0;
byte[] buffer = new byte[1024 * 8]; // 8k buffer
while ((var read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
bytesRead += read;
progressCallback(read);
}
}