OK, I found a workaround:
self::$cache_match_num is resetting every time the page changes. This means that is starts from 0 again so it loads the wp-syntax contents of the first page.
A workaround is to offset cache depending on page e.g.
…
public static function afterFilterContent( $content ) {
global $post, $page;
…
self::$cache_match_num = ($page – 1) * 10;
…