First I run this query against the OperationsManager DB:
SELECT * FROM dbo.[BasemanagedEntity] where FullName Like '%computername%'
This shows me all instances that still reside in the DB for that computer. Scroll over the the IsManaged and IsDeleted column. You'll often, not always, notice a mixture of 1's and 0's. Ideally if you want this server deleted IsManaged = 0 and IsDeleted = 1. All it takes is one of the items in the IsDeleted column to show 0 for the object to show in the console in a gray state.
Which leads us to the SQL query to remove these from the console:
USE [OperationsManager]
UPDATE dbo.[BaseManagedEntity]
SET
[IsManaged] = 0,
[IsDeleted] = 1,
[LastModified] = getutcdate()
WHERE FullName like '%computername%'
Now IsManaged = 0 and IsDeleted = 1. Refresh your SCOM Console and...
No more gray agent :)
The query to run the data purging Stored Proc is as follows:
DECLARE @GroomingThresholdUTC datetime
SET @GroomingThresholdUTC = DATEADD(d,-2,GETUTCDATE())
UPDATE BaseManagedEntity
SET LastModified = @GroomingThresholdUTC
WHERE [IsDeleted] = 1
UPDATE Relationship
SET LastModified = @GroomingThresholdUTC
WHERE [IsDeleted] = 1
UPDATE TypedManagedEntity
SET LastModified = @GroomingThresholdUTC
WHERE [IsDeleted] = 1
EXEC p_DataPurging
I believe this runs each night but just in case you want to force it. Should only take a few seconds.
If that doesn't fix it, follow this guide: http://blogs.technet.com/b/kevinholman/archive/2008/09/29/agent-pending-actions-can-get-out-of-synch-between-the-console-and-the-database.aspx