Please do not take the poster's advice who said to skip St. John. It is the most breathtaking place in the Caribbean. It is no big deal to go there and still haveplenty of time for shopping in the afternoon.
This is what we do: get off the ship early and take a taxi to Red Hook (taxi ride is about 20 min. depending on traffic, maybe less). We catch the 9 am ferry over to Cruz Bay, St. John. The ferry is $4 pp one way and it takes 20 minutes. It runs every hour on the hour. Once you get to Cruz Bay, St. John, there will be lots of taxi drivers willing to take you to any beach you want (Trunk Bay is nice, but Cinnamon Bay right next door is less crowded and still has amenities such as beach chair rentals, showers, bathrooms, etc.). It's free admission at Cinnamon Bay; Trunk Bay is about $4 pp. BTW, your taxi driver taking you from the ship to Red Hook may "hook" you up with a taxi driver over on St. John. Don't hesitate to take him up on his offer. He will tell you who to look for, and they will be standing at the dock waiting for you. The prices are all preset, so nobody will rip you off. We spend the day at the beach and have our driver come back to get us around 12:00 so we can catch the 12:30 (they run every half hour on the hour) ferry to Charlotte Amalie to do some shopping (the driver we tell to come back and get us at a predetermined time has never let us down; they all want to compete for your business, so he will show up to get you, don't worry). We skip going back to the ship entirely. If you take the ferry back to Charlotte Amalie instead of back to Red Hook, it will put you very nearby the shopping. We take a change of clothes with us and shower at the beach before heading back. We are easily able to do both and still be back at the ship by 3 or 4 p.m.