Why does FREEPROCCACHE let you shrink tempdb?
This answer is based on comments under the question by @MrTCS pointing to this link and by @KrisGruttemeyer with this summary


  TL;DR - "What is important is that the cached objects are tied to a query plan and that by freeing the procedure cache you can make those objects go away, allowing you to shrink your files."


As I understand it: 

What is happening when you can’t shrink tempdb, as there is a pointer (or something) physically located on the last page(s) of the datafile.  It points to the query plan that caused tempdb to fill.  That page will not be released as long as that query plan exists.  The nuclear option is DBCC FREEPROCCACHE, which clears all the query plans, and the page is released.