Note: Look for more details on the below steps upcoming on my blog. Below is just a general outline.
Step 1: Getting the Data into Notes Documents
Because of the time it tool to compile the data I decided to start out with only two sport: Alpine Skiing and Biathlon. I wanted to spend my time on the display grid rather than on compiling the entire result list. From there I imported the data into Notes using a CSV file and a format (.col) file. The result is a data in a view like shown below.

Step 2: Convert the Data to JSON
I'm going to use a repeat control to display each row. To make this work I need to translate the data that is one document per result into JSON so it can be displayed as on row per event. To do this I used SSJS in the beforePageLoad event to loop through the docs in the view and build a proper JSON string. Then I stored that string in a session scope variable.
Step 3: Bind the JSON to the Repeat Control
In the repeat control binding I used the JSON.parse() function to parse the JSON from the session scope variable and returned the result as the data binding.
Step 4: Build the Display HTML Using a SSJS Function
Using another SSJS function I built the entire row of HTML for the display referencing each row using the row attribute of the repeat control. I had to account for the case that not every event was contested in each Olympic Games edition.
Step 5: Add the Bells and Whistles
Here I used a lot of jQuery to filter the results based on the country and change the display of the medal graphics accordingly. I added some mouseover features on the results themselves and an expand/collapse effect for the sport headers.
Step 6: Analysis
This technique obviously has some negative points. The CSS and HTML surrounding the grid was fussy and the whole thing blew up when I scaled up the results to very large number using Summer Olympic results (which were easier to obtain). Watch that for additional work as I work on an alternate method that will work with that larger data set.