Modifying loop on a custom page, strange behaviour

pre_get_posts does not work as expected on true pages and static front pages. You should create a custom query using WP_Query to return the posts that you need.

EDIT

Thanks to @birgire in comments, here is an interesting approach using pre_get_posts with a static front page