As for listing letters for entries I have tghe following:
\define all-initials()
<$list filter="[tag[glossaire]]">
<$set name=1st value={{{ [all[current]split[]first[]] }}}>
<<1st>>
</$set>
</$list>
\end
\define glossaryList()
<$wikify name="all-letters" text=<<all-initials>>>
<$list filter="[<all-letters>uppercase[]split[É]join[E]split[]each:value[]!is[missing]]" variable="letter">
<$link to=<<letter>>/>
</$list>
<$list filter="[<all-letters>uppercase[]split[É]join[E]split[]each:value[]!is[missing]]" variable="letter">
<h3><$link to=<<letter>>/></h3>
<$set name="entries" filter="[<letter>addprefix[{{]addsuffix[}}]]">
<<entries>>
</$set>
</$list>
</$wikify>
\end
added twist: make É and E the same entry. letters not used are not seen. This example is with a "glossaire" tag, you would use "people" instead or make it a variable of all-initials macro. the macro to be used is glossaryList (no argument).
You would have to adapt it to your needs and language perhaps.
note: I have created letterr tiddlers "A"', "B"', "C" etc before hand. I have not yet found out how to create them on purpose (and delete them on purpose too). But they all have the same content (a call to another macro). Some are not used, that's it.