We've stayed at a few places.
The first place we stayed was at the Sheraton Miami Airport. We had to take a hotel shuttle to get shopping done. Not convenient if you want to go get groceries. However, free shuttle from the airport. However, you did have to sign up for a shuttle to get to the port. Didn't take that long to get there.
The second place was the Courtyard Marriott Airport and took a taxi over to the port. Again, it didn't take that long to get there. It was in semi-walking distance to a grocery store, though not sure if that's still there or not. However, I would only do that walk in the daytime.
The third place we stayed was the JW Marriott Marquis. Now that was a super nice hotel. There's a Whole Foods and a Walgreens half a block away. It was really quick getting to the port. Quicker than the other places, but again it was maybe by like 15 to 20 mins. There was a Courtyard across the street from the JW Marriott Marquis, but it only cost 5,000 less points than the JW Marriott Marquis. I can't say how nice it was, but based on reviews of the rooms, the JW Marriott wins hands down.
Our criteria was really to find places where we could get to a grocery store within walking distance so we could bring food/water onboard. If I was paying cash, I'd stay further out near the airport (it wouldn't matter how nice it was). If I was using points, I'd stay at the JW Marriott Marquis.