To create his website, we went with a content model where each photo has it's own page. Then we used a couple of custom templates for the image block and page list block to create the thumbnail lists and large images. The page list template grabs the image area from the photo's page, applies a 'thumbnail' custom template to all image blocks, then displays. It's similar to how the blog template works in the core CMS, but for images.
Rather than have John manually enter the size for each image, we applied another custom template 'photo detail' for the main photo pages, all he has to do is upload the image and concrete5 handles the rest.
All in all, it is a pretty simplistic site but we're really proud of the way it all fits together and how easy it is for John to update his website going forward. Concrete5 saved us tons of time in the development as well. We could have easily coded up something this simple from scratch, but concrete5 made this a project that was measured in hours rather than days.