Problem number 1 exists because negative numbers are rounded differently than positive numbers. When the left side of the player sprite is at 0, and the velocity is -.75 pixels, the planned position will be three quarters of a pixel off the left edge, that position rounds to zero, so the player is still actually on the map in terms of whole pixels. The player is allowed to move its planned velocity as long is it thinks it's not hitting a solid, and since its planned position is still on the map, it hasn't hit anything yet. So then the player's position is at -.75. Its next position (continuing this velocity) will put it beyond -1. This is clearly off the edge of the map, so the velocity gets set to some positive number that will get it back to position 0 in one frame. Of course if the inertia is more than 0%, the player will move a little extra after getting to 0. That's what causes the player to "bounce" back a bit from the edge.
Compare that to when the player hits a normal wall on it's left: assume the position of the player is 32, and theres a solid pixel at position 31. If the player's velocity is -.75 again, this time it will end up at 31.25. But since this is a positive number, that rounds to 31 instead of 32. So immediately the player can see that it will be on the solid pixel at position 31 and bounce back to 32. Why doesn't inertia cause it to bounce back farther? Because the player is at position 32 and it's new planned position is at 32. There is no velocity required to move the player back to the position it needs to be at. It's already there.
I found that I can work around this problem by changing the PixelX and ProposedPixelX properties of SpriteBase (which are responsible for rounding the sprite's position to a whole number) to add some arbitrary number before rounding, and then subtract it afterwards, but this seems like a lot of overhead to impose on every sprite at every position for such a small problem that can be ignored or worked around by having borders on your maps. I could use Math.Floor instead of casting the position to an integer to work around the problem too (that rounds toward negative infinity instead of rounding toward zero), but after doing performance testing on that, I can see that it's more than twice as slow as casting to an integer. Adding and subtracting is about 7% slower than a straight typecast, and using Math.Floor is 123% slower. Typecasting the position to an int seems to be the most efficient way to round the position of the sprite to a whole pixel.
So I added comments to SpriteBase to explain how to eliminate that behavior if it's really worth the overhead, but the default code will still behave the same.