Если вы хотите отслеживать процесс загрузки, вам нужно использовать UploadFileAsync вместо UploadData.
С помощью UploadDataAsync вы должны вручную разбить файл на части и отобразить прогресс (по крайней мере, это то, что я определил по собственному опыту в этом вопросе, хотя я не видел его таковым написанным на MSDN).
Вместо этого вы должны использовать UploadFileAsync, который будет правильно вызывать событие UploadProgressChanged. Затем вы можете просмотреть свойства аргументов событий BytesSent и TotalBytesToSend, которые должны быть правильно отражены.
Я предполагаю, что логическое обоснование этого заключается в том, что при отправке данных вы можете циклически перебирать фрагменты вашего потока данных и вручную увеличивать отслеживание прогресса, тогда как с помощью файла вы не можете (.NET будет управлять целым загрузить для вас). Лично я чувствую, что есть что-то подозрительное, потому что нет причины вызывать событие UploadProgressChanged с неверной информацией в случае UploadDataAsync - либо оно вызывается с действительной, правильной информацией, либо оно вообще не вызывается.
В любом случае, попробуйте UploadFileAsync и посмотрите, как это будет.