You can use the class System.Zip.TZipFile of the delphi itself to do this implementation, looping the files with the same name (with different extensions) and adding them in the zip according to the rule you set, follow the example based on the question:
uses
System.SysUtils,
StrUtils,
Classes,
System.Zip;
var
vArquivos: TStringList;
vDiretorio: String;
vDiretorioSaida: String;
searchResult : TSearchRec;
vArquivoSemExtensao: String;
I: Integer;
ZipFile: TZipFile;
begin
vDiretorio := 'D:\Arquivos';
vDiretorioSaida := 'D:\ArquivosZipado';
vArquivos := TStringList.Create;
try
if findfirst(vDiretorio+'\*.*', faAnyFile, searchResult) = 0 then
begin
repeat
vArquivos.Sort;
if (searchResult.Name <> '.') and (searchResult.Name <> '..') then
begin
vArquivoSemExtensao := ChangeFileExt(searchResult.Name, '');
if not vArquivos.Find(vArquivoSemExtensao, I) Then
vArquivos.Add(vArquivoSemExtensao);
end;
until FindNext(searchResult) <> 0;
end;
FindClose(searchResult);
for I := 0 to vArquivos.Count -1 do
begin
ZipFile := TZipFile.Create;
try
ZipFile.Open(vDiretorioSaida+'\'+vArquivos.Strings[I]+'.zip', zmWrite);
if findfirst(vDiretorio+'\'+vArquivos.Strings[I]+'.*', faAnyFile, searchResult) = 0 then
begin
repeat
ZipFile.add(vDiretorio+'\'+searchResult.Name);
until (FindNext(searchResult) <> 0);
end;
FindClose(searchResult);
finally
FreeAndNil(ZipFile);
end;
end;
finally
FreeAndNil(vArquivos);
end;
end.