Это фича.
Вот выдержка их моей статьи (http://habrahabr.ru/blogs/net/26146/):
VaryByParam – задает условное кэширование основанное на значениях строки запроса при GET или параметров при POST. Значения должны перечисляться через точку с запятой. Похоже, что условное кэширование происходит только на сервере, потому что вне зависимости от значения VaryByParam в http-заголовок Vary равен «*». VaryByParam – обязателен к указанию, если не задан атрибут VaryByControl. VaryByParam может быть равен «none» и тогда условного по параметрам кэширования не происходит, либо VaryByParam может быть равен «*» и тогда условное кэширование производится по всем параметрам.
То есть, при get все у вас работало и кэшировалось по параметру строки запроса, но когда дело доходило до post, то кеширование не работало, потому что основывается на параметрах post. Введя такой параметр, вы добились нужного вам результата.
habrahabr.ru/blogs/net/26146/#comment_659298 Тут Вы говорили об обязательном обновлении части кешированной страницы. Я вот запамятовал, как это называется и как это реализовать. Например, на кешированной странице контрол ascx, который не нуно кешировать
Проблема при использовании OutputCache в CustomControl