There's no way to have an XPath query that returns multiple nodes, such as yours, aggregate them into a single value for you. What's happening is that a nodeset is being returned and, since you're binding to a single string property, the infrastructure is simply coercing that nodeset by grabbing the first node from the set and then grabbing its @text node.
Honestly I have not tried this myself and don't have time at the moment, but the only way I'd expect this to ever work is if you wrote a custom IValueConverter. I assume that it will hand an XmlNodeList as the value to be converted and then you can enumerate those nodes and concatenate a comma separated string yourself.
Update
Since the IValueConverter suggestion did not work due to the XPath engine doing a pre-coercion, here's what I suggest you do: instead of binding to a single TextBlock, bind to an ItemsControl instead and define the ItemTemplate for the ItemsControl to be as follows:
<DataTemplate>
<TextBlock Text="{Binding}"/>,
</DataTemplate>
Note: in all honesty I'm taking the lazy approach in the DataTemplate and you will end up with a comma even after the last item right now. That said you should be able to define a DataTemplate with a trigger that determines that it's the last item and doesn't show the comma.
Finally, depending on how you want the data to layout also set the ItemsControl's ItemsPanel. I'm assuming you want horizontal flow with wrapping here:
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>