Я думаю, что это будет работать:
var new = $(
"<li>"
+ $("#Projects :selected").text()
+ " <span class='removeProject' projectId='" + $("#Projects").val() + "'>Remove</span>"
+ "</li>"
);
var firstafteritem = $("#projectList").children().filter( function () {
return ($(this).text() > $("#Projects :selected").text())
} ).eq(0);
if (firstafteritem.length > 0) firstafteritem.before(new);
else $("#projectList").append(new);
Значение firstafteritem
будет первым элементом списка, который имеет текстовое значение после того, который вы добавляете. (Или нет, если он будет последним.) Тогда if / else вставит его перед этим элементом или в конец списка.
(Это, конечно, предполагает, что значения вашего списка уже в порядке.)