How Do I group entries by Category and retain fixed Category Order?
Depending on your needs, you may be able to ditch the group() filter and sort your list however you need.

Get all your entries and categories. Then use the relatedTo functions to filter those lists.

{% set categories = craft.categories.group('projectCategories') %}
{% set projects = craft.entries.section('projects').order('title').limit(null) %}

{% for category in categories.relatedTo(projects) %}
  &lt;h3&gt;{{ category.title }}&lt;/h3&gt;

  &lt;ul class="no-bullet"&gt;
    {% for entry in projects.relatedTo(category) %}
      &lt;li&gt;&lt;a href="{{ entry.url }}"&gt;{{ entry.title }}&lt;/a&gt;&lt;/li&gt;
    {% endfor %}
  &lt;/ul&gt;
{% endfor %}


One caveat might be that this solution pulls all your entries and categories. This worked for my situation where I had around 50 categories and under 200 entries. I also knew these numbers wouldn't get bigger in the future.

This also makes a few other assumptions too...


You DON'T need to show entries with NO related categories like this:


Category A


entry
entry


Category B


entry


(No Categories)


entry


Also, your entries can show up under EACH category they're related to, instead of just the FIRST category like your original code. For example, if Entry 1 has Category A and Category B selected, you'll get this:

Category A


entry 1


Category B


entry 1