So, ich habe das jetzt doch mal lokal getestet, und Du hast recht, da passieren eher merkwürdige Dinge. Ein Blick in den Quelltext klärt das auch: In "wp-includes\query.php" gibt es die Funktion "&get_posts()", die macht die Arbeit beim Holen der Posts.
Und da findet sich z.B. folgendes: Wenn posts_per_page nicht gegeben ist, wird der Wert aus den Optionen genommen. Wenn showposts gegeben ist, wird posts_per_page damit überschrieben. Soweit so unschön. Da kann man sich nun streiten, ob das so richtig ist. Da es keine verbindliche Dokumentation der API gibt, kann man aber nicht mal sagen, dass das wirklich falsch ist. 
Was mich da nur sehr stutzig macht und was wohl kaum stimmen kann:
$posts = query_posts('posts_per_page=2&showposts=3');
Da hätte ich ja eigentlich zwei Seiten erwartet, eine mit zwei und eine mit einem Beitrag. Gut, mit obigem Blick in den Quelltext würde ich eine Seite mit drei Beiträgen erwarten. Angezeigt werden mir aber 15 Seiten oder so, alle weiteren Seiten werfen aber einen 404. Liegt das nun am PageNavi-Plugin?!?
Was Dein Problem betrifft: Müsste das nicht gehen, wenn Du posts_per_page mit 3 angibst und dann per Filter "limit = 6" ergänzt?!? Das schreibt sich dann direkt in die SQL-Query mit einer LIMIT-Anweisung, oder? Wobei die Frage wäre, ob sich da LIMIT und showposts vertragen, denn showposts müsste eigentlich ja auch schon ein Limit erzeugen?!?