There are a lot of options for handling this, but there is one very straightforward way we have found to handle this that does not involve re-architecting your whole app.
We have had similar issues, where our page/partial has a well-defined ViewData.Model type, but the view contains a partial that is re-used across multiple pages. We also have tried to avoid using ViewDataDictionary as well.
However, we found that exactly the case you describe is the EXACT scenario where we like to use a ViewDataDictionary entry. We keep a static Constants class in our application model that contains inner classes for each type of constant, including ViewData keys so that we don t have strings for these things floating everywhere.
Then, our Controller action populates the ViewData key and the partial inside the other page/partial checks for the existence of that key and uses that instead of ViewData.Model. It makes the partial work anywhere that it needs to and keeps your ViewModel clean. By using constants, we avoid raw strings everywhere.