Дело в том, что для реализации интерфейса вовсе не обязательно определять все методы этого интерфейса как открытые методы класса. Можно просто указать метод, который будет реализовывать интерфейсный метод, не давая ему вовсе имени:
class Progress<T> : IProgress<T>
{
void IProgress<T>.Report(T value) { ... }
// ...
}
При этом метод можно вызвать только через восходящее приведение типа (upcast).
Такая техника называется явной реализацией интерфейса. Обращаясь к документации или подглядывая в исходники можно убедиться, что так оно и есть в случае класса Progress<T>.
(Дополнительная информация по теме.)
Обычно явная реализация интерфейса используется для случая, когда нужно реализовать несколько конфликтующих интерфейсов одновременно. Типичный пример: если мы реализуем IEnumerable<T>, то мы при этом должны реализовать и необобщённый IEnumerable, и нам нужно два метода GetEnumerator: один, возвращающий IEnumerator<T>, и один, возвращающий IEnumerator. Без явной реализации интерфейса это было бы невозможно без трюков (например, вспомогательного промежуточного класса). С явной реализацией обычно пишут так:
class C<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator() { /* реализация */ }
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
Для чего же так сделано в классе Progress<T>? Можно только гадать, гугл и исходники ответа на вопрос не дали. Нескольких интерфейсов Progress<T> не реализует, так что использование явной реализации не является строго необходимым.
Предположу, что это сделано, чтобы стимулировать передачу в фоновые методы объекта не конкретного типа Progress<T>, а интерфейсного типа IProgress<T> (что позволит легко подменять реализацию на другую).