I'm afraid there is not any simple answer beyond "It depends". Things like indexing and performance is a lot about tradeoff, and in the end a good gut feeling is needed.
That said, I will go on with some examples. Consider this query:
SELECT a, b, SUM(c)
FROM tbl
WHERE d = @value
AND e = 1 -- e Can only be 0 or 1 with a 50/50 distribution
GROUP BY a, b
We can construct many indexes for this query. The "ideal" index would be
CREATE INDEX ix ON tbl(d, e, a, b) INCLUDE(c)
d should be the leading column, because it is the most selective. a and b should be at the end, because with d and e on top, SQL Server can locate all matching rows, and then scan this in order to perform the GROUP BY.
However, there may be reasons I don't want to create the index this way. As I indicated, e is not very selective. Maybe I have a twin query which is the same, except that the condition on e is not there, and I don't want to create two indexes that are similar to each other. After all, there is a cost to maintain indexes.
If I take out e entirely from the index, this means that the query above has to go to the data page to find the value of e. But in that case, there is no much point in having c included.
So this leaves is with any of:
CREATE INDEX ix1 ON tbl(d, a, b) INCLUDE(c, e)
CREATE INDEX ix2 ON tbl(c, a, d)
CREATE INDEX ix2 ON tbl(c, a, d) INCLUDE(e)
Now you may ask where did the last one come from? So this is my personal take on included columns. Many advocate adding columns in the SELECT list as included columns to make the index covering and the query to perform better. However, my experience is that the index will only be covering for a little while. Say that we decide to use ix1. But then two months later, there is a new requirement that we should also return AVG(f) from the query. ix1 will no longer be covering, unless we also add f as an included column. But by then, we have already forgotten about our index-tuning operation, and we don't add f. And, who knows, maybe we don't notice that the query is slower.
So this is why I am less fond of putting columns from the SELECT list into the index only to make it covering. On the other hand, I'm more keen on adding a column in the WHERE-JOIN logic as an included column. There are two reasons for this. One is that it will reduced the number of key lookups more than if you add columns in the SELECT list, since without the included column you need to make key lookups also for non-matching rows (exactly to find that they don't match). The other reason is that these conditions tend to me more stable, so the odds are better that this part of the query remains covered even if the query changes.
I realise that this was not the type of answer you were looking for. But I still hope that this answer has given you some sort of insight.