To keep rendering perfectly separate from the game logic, animations - at least the ones that have no game logic impact - are solely done from the "rendering" side. A common pattern is to record the transition using three bits of data:
- Start value
- End value
- Time (between 0 and 1)
The advantage of this approach is that it can be easily fed into an easing function so you can choose a style that suits.
To use this pattern, you detect whenever the player has moved from one tile to another. The start value will be the position of the previous tile, the end value will
be that of the current tile, but to figure out time you need to record when the player began moving, and compare that against the current game time.
That's not the only method though; a simpler method would be to track the player's position in the "rendering" side, and constantly move this position towards the "game logic"'s position.
But finally, don't be so concerned about having the perfect design, especially when making games; if it's easier to hold some "rendering" data in the "game logic", just do it - you can clean it up later if it's hampering things.