A hierarchical viewer will only work if you have a parent/child relationship setup between the letters and the events. In my opinion, its a bit more work to do that than what it's worth.
Simplest thing I can think of is using a Query Repeater and creating a query on the events to get the distinct letters for the events you have in the system.
select distinct UPPER(SUBSTRING(EventName,1,1)) AS [Letter]
from CONTENT_Event
Then inside the transformation for the "letter", you'd have a nested repeater that would get the top N events that have an event name starting with the letter being rendered. Your query repeater transformation might look something like this:
<script runat="server">
protected override void OnInit(EventArgs e)
{
string letter = ValidationHelper.GetString(Eval("Letter"), ""); // get the current letter being rendered
if (!string.IsNullOrEmpty(letter))
{
// only set and bind the repeater if there's a letter
rptNested.Where = "EventName LIKE '" + letter + "%'";
rptNested.ReloadData(true);
}
}
</script>
<div>
<h2><%# Eval("Letter") %>.</h2>
<hr />
<cms:CMSRepeater ID="rptNested" runat="server" TransformationName="cms.event.yourtransformation" ClassNames="cms.event" TopN="5" OrderBy="EventDate" />
</div>